/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Clases;
import CapaNegocios.CNOrden;
import entidad.Mesa;
import entidad.Bebidas;
import entidad.Platos;
import entidad.Usuarios;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.table.DefaultTableModel;
import entidad.Detalleorden;
import entidad.Orden;
/**
 *
 * @author a
 */
public class OrdenesMesas {
    
    private Mesa mesa ;
    private Usuarios usuario;
    private boolean activo;
    private List<DetalleOrdenMesa> detalle;
    private int indexBoton;
    public int HoraInicial;
    public int MinutoInicial;
    private Orden orden;
    private float pagado;
    
    public OrdenesMesas(Mesa mesas,int index)
    {
        this.mesa = mesas;
        this.usuario = null;
        activo =false;     
        detalle= new ArrayList();
        this.indexBoton=index;
        orden=null;
        pagado=0;
    }

    /**
     * @return the mesa
     */
    public Mesa getMesa() {
        return mesa;
    }
    
     public void setMesa(Mesa mesa) {
        this.mesa= mesa;
    }
    
    public Orden getOrden()
    {
        return this.orden;
    }
    public void setOrden(Orden orden)
    {
        this.orden = orden;
    }



    /**
     * @return the usuario
     */
    public Usuarios getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(Usuarios usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the activo
     */
    public boolean isActivo() {
        return activo;
    }

    /**
     * @param activo the activo to set
     */
    public void setActivo(boolean activo) {
        this.activo = activo;
    }
    
    public void reiniciar()
    {
        this.usuario = null;
        activo =false;     
        detalle= new ArrayList();
        orden=null;
        pagado=0;
    }
       
    public static OrdenesMesas buscarOrden (List<OrdenesMesas> lista,int idMesa)
    {
        OrdenesMesas orden = null;
        Iterator<OrdenesMesas> iter = lista.listIterator();
        OrdenesMesas or=null;
        while(iter.hasNext())
        {
            or=iter.next();
            if(or.getMesa().getIdMesa()==idMesa)
                orden= or;
        }        
        return orden;
    }
    
    public void agregarDetalle(List<Detalleorden> lista)
    {
        detalle.clear();
        for(Detalleorden or : lista)
        {
            DetalleOrdenMesa det = new DetalleOrdenMesa();
            det.setBebida(or.getBebidasIdbebidas());
            det.setPlato(or.getPlatosidPlatos());
            det.setIdDetalle(or.getIdDetalleOrden());
            det.setCantidad(or.getCantidad());
            det.setDescripcion(or.getDescripcion());
            detalle.add(det);
        }
    }
    
    public  boolean AgregarPlato (Platos plato)
    {
        boolean var = false;
        Iterator<DetalleOrdenMesa> iter = getDetalle().listIterator();
        DetalleOrdenMesa or=null;
        while(iter.hasNext())
        {
            or=iter.next();
            if(or.getPlatoBool())//verifica si el detalles es de plato
            if(or.getPlato().getIdPlatos()== plato.getIdPlatos()&&
                    or.getEspecialidad().equals("")&&
                    or.getIdDetalle()==0)// verificar si el plato esta repetido o se debe de crear
            {
                or.setCantidadAumentar();
                var=true;
                activo=true;
            }
        }  
        if(!var)
        {
            getDetalle().add(new DetalleOrdenMesa(plato));
            activo = true;
        }
        if(this.orden!=null)
            orden.setTotal(this.total()+pagado);
        return var;
    }
    
    public  boolean AgregarBebida (Bebidas bebida)
    {
        boolean var = false;
        Iterator<DetalleOrdenMesa> iter = getDetalle().listIterator();
        DetalleOrdenMesa or=null;
        while(iter.hasNext())
        {
            or=iter.next();
            if(or.getBebidaBool())//verifica si el detalle es de bebida
            if(or.getBebida().getIdbebidas()== bebida.getIdbebidas()&&
                    or.getEspecialidad().equals("")&&
                    or.getIdDetalle()==0)//verificar si el detalle ya esta creado
            {
                or.setCantidadAumentar();
                var=true;
                activo=true;
            }
        }  
        if(!var)
        {
            getDetalle().add(new DetalleOrdenMesa(bebida));
            activo = true;
        }
        if(this.orden!=null)
            orden.setTotal(this.total()+pagado);
        return var;
    }
    
    public void limpiar(float pagado,float descuento)
    {
        if(pagado==0)
        {
            this.orden.setPagado(true);
            CNOrden.modificar(this.orden);
            this.usuario = null;
            orden=null;
            activo =false;   
            detalle.clear();
            this.pagado=0;
            detalle= new ArrayList();
            return;
        }
        float subtotal =this.total()+this.pagado-descuento;
        if(descuento>0)
            this.orden.setTotal(this.orden.getTotal()-descuento);
        this.pagado=pagado;
        if(pagado== subtotal)
        {
            this.orden.setPagado(true);
            CNOrden.modificar(this.orden);
            this.usuario = null;
            orden=null;
            activo =false;   
            detalle.clear();
            this.pagado=0;
            detalle= new ArrayList();
        }
    }
    
    public void regresarModelo(DefaultTableModel modelo)
    {
        Iterator<DetalleOrdenMesa> iter = getDetalle().listIterator();
        DetalleOrdenMesa or=null;
        while(iter.hasNext())
        {
            or = iter.next();
            if(or.getBebida()!=null)
            {
                
                modelo.addRow(new Object[]{or.getBebida().getNombre(),or.getCantidad(),or.getBebida().getPrecio(),or.getEspecialidad()});
            }
            if(or.getPlato()!=null)
            {
                modelo.addRow(new Object[]{or.getPlato().getNombre(),or.getCantidad(),or.getPlato().getPrecio(),or.getEspecialidad()});
            }
        }
        
    }

    /**
     * @return the indexBoton
     */
    public int getIndexBoton() {
        return indexBoton;
    }

    /**
     * @return the detalle
     */
    public List<DetalleOrdenMesa> getDetalle() {
        return detalle;
    }
    
    public void setDetalle(List<DetalleOrdenMesa> lis)
    {
        this.detalle=lis;
        activo=true;
    }
    
    public void eliminarDetalle()
    {
        this.detalle=new ArrayList();
        activo=false;
    }
    
    public Float total()
    {
        float total =0;
        Iterator<DetalleOrdenMesa> iter = getDetalle().listIterator();
        DetalleOrdenMesa or=null;
        while(iter.hasNext())
        {
            or=iter.next();
            total = total + or.subTotal();            
        }
        if(this.orden!=null)
            this.orden.setTotal(total);
        return total-pagado;
    }
    
    public void eliminaDetalle(int id)
    {
        detalle.remove(id);
        if(detalle.isEmpty())
            activo=false;
    }
    
    public List<Detalleorden> regresarDetalleOrdenes()
    {
        List<Detalleorden> lista = new ArrayList<>();
        Iterator<DetalleOrdenMesa> iter = getDetalle().listIterator();
        DetalleOrdenMesa or=null;
        while(iter.hasNext())
        {
            or=iter.next();
            Detalleorden deta = new Detalleorden();
            deta.setActivo(true);
            deta.setBebidasIdbebidas(or.getBebida());
            deta.setCantidad(or.getCantidad());
            deta.setPlatosidPlatos(or.getPlato());
            deta.setDescripcion(or.getEspecialidad());
            deta.setIdDetalleOrden(or.getIdDetalle());
            deta.setOrdenidOrden(orden);
            lista.add(deta);            
        }
        
        return lista;
    }
    
    //si existe algun detalle de mesas entonces regresa false
    public static boolean verificarMesasSinOrden(List<OrdenesMesas> lista)
    {
        Iterator<OrdenesMesas> iter = lista.listIterator();
        OrdenesMesas or=null;
        while(iter.hasNext())
        {
            or= iter.next();
            if(!or.detalle.isEmpty())
                return false;
            
        }
        return true;
    }
 
    //saber orden de mesa
    public void agregarOrdenMesa(int x,String espe)
    {
        DetalleOrdenMesa temp =detalle.get(x).agregarEspecialidad(espe);
        if(temp!=null)
            detalle.add(temp);                
    }
}
